package com.chw;

import java.lang.instrument.*;
import java.security.ProtectionDomain;

/**
 * @author chehongwei
 */
public class AgentMain {
    public static void premain(String args, Instrumentation instrumentation) {

    }


    /**
     * 使用agent自定义类
     *
     * @param args
     * @param instrumentation
     * @throws UnmodifiableClassException
     * @throws ClassNotFoundException
     */
    public static void premain_back(String args, Instrumentation instrumentation)
            throws UnmodifiableClassException, ClassNotFoundException {
        System.out.println("hello-agent");
        UserService.class.getAnnotatedInterfaces();
        // 拦截类装载过程 在执行方法前加载的类，不会被再次加载
        instrumentation.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader loader,
                                    String className,
                                    Class<?> classBeingRedefined,
                                    ProtectionDomain protectionDomain,
                                    byte[] classfileBuffer) throws IllegalClassFormatException {

                System.out.println(className);
                return null;
            }
        }, true);
        // 重新加载类  需要修改pom文件中的 Can-Retransform-Classes 属性为 true
        // instrumentation.addTransformer 方法 canRetransform 设置为 true
        instrumentation.retransformClasses(UserService.class);

        // 重新定义类,使用指定字节码替换类 需要将pom文件中 Can-Redefine-Classes 属性设置为true
        // 只能对已有的方法进行修改，不能新增方法
        instrumentation.redefineClasses(new ClassDefinition(UserService.class, new byte[0]));
    }
}
